Graph-based Research with Agents for Automatic Labelling
INSEE
13 janvier 2026
%%{init: {'theme':'base', 'themeVariables': { 'fontSize': '16px'}}}%%
flowchart TB
Input["🏢 Description entreprise"]
subgraph GRAAL["Framework GRAAL"]
GA["🔍 Graph Agent<br/>Navigation hiérarchique"]
RA["📚 RAG Agent<br/>Recherche contextuelle"]
EA["✅ Evaluation Agent<br/>Validation & scoring"]
subgraph KG["Knowledge Graph"]
N1["NACE Codes"]
N2["Relations"]
N3["Descriptions"]
end
end
Output["📊 Code + Confiance + Justification"]
Input --> GA
GA <--> KG
GA --> RA
RA <--> KG
RA --> EA
EA --> Output
style GRAAL fill:#e8f5e9
style KG fill:#fff3e0%%{init: {'theme':'base', 'themeVariables': { 'fontSize': '16px'}}}%%
flowchart TB
Input["🏢 Description entreprise"]
subgraph GRAAL["Framework GRAAL"]
GA["🔍 Graph Agent<br/>Navigation hiérarchique"]
RA["📚 RAG Agent<br/>Recherche contextuelle"]
EA["✅ Evaluation Agent<br/>Validation & scoring"]
subgraph KG["Knowledge Graph"]
N1["NACE Codes"]
N2["Relations"]
N3["Descriptions"]
end
end
Output["📊 Code + Confiance + Justification"]
Input --> GA
GA <--> KG
GA --> RA
RA <--> KG
RA --> EA
EA --> Output
style GRAAL fill:#e8f5e9
style KG fill:#fff3e0
# Navigation intelligente
class GraphNavigator:
def navigate(self, description):
# 1. Identifier section (A-U)
section = self.find_section(description)
# 2. Descendre division (01-99)
division = self.explore_division(
section, description
)
# 3. Raffiner groupe/classe
return self.refine_classification(
division, description
)✅ Exploration guidée - Suit la structure NACE - Réduit l’espace de recherche
✅ Traçabilité complète - Chemin de décision clair - Justifications à chaque étape
✅ Cohérence garantie - Respect des contraintes hiérarchiques - Pas de codes invalides
from langchain.agents import AgentExecutor
from neo4j import GraphDatabase
from typing import Dict, List
class NavigatorAgent:
def __init__(self, graph_uri: str):
self.driver = GraphDatabase.driver(graph_uri)
self.tools = self._create_navigation_tools()
def classify(self, description: str) -> Dict:
# 1. Analyse initiale
context = self.extract_features(description)
# 2. Navigation hiérarchique
path = self.navigate_hierarchy(context)
# 3. Validation finale
result = self.validate_classification(path)
return {
"code": result.code,
"confidence": result.confidence,
"justification": result.explanation
}Note
Évaluation sur 1,800 entreprises annotées manuellement (golden dataset)
| Métrique | Baseline | GRAAL | Gain |
|---|---|---|---|
| Précision Top-1 | 70% | 89% | +19% |
| Précision Top-3 | 82% | 96% | +14% |
| Rappel | 68% | 87% | +19% |
| F1-Score | 0.69 | 0.88 | +0.19 |
| Temps médian | 120ms | 450ms | +330ms |
✅ Explicabilité : 100% des décisions justifiées
✅ Cohérence : <2% de variance inter-runs
✅ Auditabilité : Trace complète du raisonnement
✅ Adaptabilité : Mise à jour facile des règles
✅ Scalabilité : 10K classifications/heure
Important
Principale source d’erreur : Entreprises multi-activités nécessitant une analyse du chiffre d’affaires
Démo live
Démonstration de l’interface web : graal-demo.lab.sspcloud.fr
%%{init: {'theme':'base'}}%%
timeline
title Roadmap GRAAL 2025-2027
Q1 2025 : API Production
: Tests A/B
: Documentation
Q2 2025 : Déploiement pilote
: Formation utilisateurs
Q3 2025 : Extension COICOP
: Multilingue (EN/DE)
2026 : Généralisation INSEE
: Open source
2027 : Standard européen
: Collaboration Eurostat%%{init: {'theme':'base'}}%%
timeline
title Roadmap GRAAL 2025-2027
Q1 2025 : API Production
: Tests A/B
: Documentation
Q2 2025 : Déploiement pilote
: Formation utilisateurs
Q3 2025 : Extension COICOP
: Multilingue (EN/DE)
2026 : Généralisation INSEE
: Open source
2027 : Standard européen
: Collaboration Eurostat
📧 theo.ferry@insee.fr
| Dataset | Taille | Baseline | GRAAL | Temps |
|---|---|---|---|---|
| SIRENE | 10K | 68% | 87% | 2.3h |
| NAF-Test | 5K | 72% | 91% | 1.1h |
| EU-Business | 15K | 65% | 85% | 3.5h |
Corps techniques de l’État - 2025